#include<stdio.h>
#include"ohos_init.h"
#include"cmsis_os2.h"//线程api osThreadNew  这种os方法的api 
#include<unistd.h>//posix


//线程要执行的函数 
//！！！注意这个是线程要执行的函数 不是本案例的入口函数
//待会会创建一个本案例的入口函数 ThreadTestTask APP_FEATHRE_INIT(ThreadTestTask)以优先级2执行这个函数  函数中会创建一个线程 创建的这个线程会执行这个函数
void reosv2_thread_main(void *arg)
{
    //延迟一秒这个线程避免跟系统输出混在一起
    osDelay(1000);
    //打印当前线程id  这里的当前线程的id就是入口函数中创建的线程的id
    osThreadId_t pid=osThreadGetId();
    printf("threadid is %d\n",pid);
    //获得当前线程的名字
    const char *thread_name=osThreadGetName(pid);//osThreadGetName() 返回的是指向线程名字的指针，而 name 是一个字符数组，不能直接赋值指针给字符数组。
    char name[64];
    strcpy(name, thread_name);
    printf("threadName is %s\n",name);
    //打印参数 ？
    printf("agr is : %s\n",(char *)arg);
    //上面获得了当前线程的id 现在在当前线程中不停打印1 2 3 4..
    static int  counts=0;//不能count 那就不能变了
    while(1)
    {
        counts++;
        printf("count is %d\n",counts);
        osDelay(500);
    }
}
//这个是入口函数 
//入口函数不能执行一些耗时的操作不然会阻碍其他程序的运行 
//所以当入口函数需要执行耗时的操作时就会另外在外面创建一个线程 让这个线程去执行想要的 这样入口函数就不会耗时了
static void ThreadTestTask(void)
{
    //不能耗时 
    //创建线程执行耗时的
    //定义线程的属性
    osThreadAttr_t attr;
    //线程的名字
    attr.name="thread_bai";
    //线程属性位
    attr.attr_bits=0U;
    //线程控制块的内存大小
    attr.cb_size=0U;
    //线程栈初始地址 默认系统自动分配
    attr.cb_mem=NULL;
    //线程栈内存大小
    attr.stack_size=1024;
    //线程优先级 优先级由高到低9-38等级 系统默认的是正常优先级osPriorityNormal
    //优先级的声明也在kernel\liteos_m\kal\cmsis_os2.h 上面头文件导入过了这个头文件 所以直接用osPriorityNormal
    attr.priority=osPriorityNormal;

    //线程的属性设置完成 下面创建一个线程
    //参数 线程要执行的函数 传递给线程的参数(就是执行函数中的参数void *arg) 线程属性 
    //osThreadNew返回所创建的线程的id
    // osThreadNew((osThreadFunc_t)reosv2_thread_main,"I am canshu",&attr);
    if(osThreadNew((osThreadFunc_t)reosv2_thread_main,"I am canshu",&attr)==NULL)
    {   //对函数右键转到声明查看函数具体内容 得到：
        //* @return Returns the thread name; returns NULL in the case of an error.
        //创建成功返回线程名字 失败返回NULL
        printf("New thread is fail\n");
    }
}
APP_FEATURE_INIT(ThreadTestTask);//让入口函数以优先级2在阶段8执行